﻿using System;
using System.Collections.Generic;
using Csla;
using Ent.AccesoDatos;

namespace Ent.Inscripcion.Core.Core
{
    [Serializable]
    public class DatosEstadisticaLista :
      ReadOnlyListBase<DatosEstadisticaLista, DatoEstadisticaInfo>
    {

        #region Factory Methods

        public static DatosEstadisticaLista GetDatosEstadisticaLista(DatoEstadisticaCriterio criteria)
        {
            return DataPortal.FetchChild<DatosEstadisticaLista>(criteria);
        }

        private DatosEstadisticaLista()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(DatoEstadisticaCriterio criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            // TODO: load values
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Variable", criteria.Variable)};
            var nombreS = criteria.TipoReporte == Tipo.Tutoria ? "ReporteEstadisticoTutoria" : "ReporteEstadisticoExamen";
            var datos = accesoDatos.EjecutarReader(nombreS, parametros);
            while (datos.Datos.Read())
            {
                Add(DatoEstadisticaInfo.GetDatoEstadisticaInfo(datos));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class DatoEstadisticaInfo : ReadOnlyBase<DatoEstadisticaInfo>
    {
        #region Business Methods
        
        public static readonly PropertyInfo<string> ValorProperty = RegisterProperty<string>(c => c.Valor);
        /// <Summary>
        /// Gets or sets the Valor value.
        /// </Summary>
        public string Valor
        {
            get { return GetProperty(ValorProperty); }
        }

        public static readonly PropertyInfo<int> CantidadProperty = RegisterProperty<int>(c => c.Cantidad);
        /// <Summary>
        /// Gets or sets the Cantidad value.
        /// </Summary>
        public int Cantidad
        {
            get { return GetProperty(CantidadProperty); }
        }

        public static readonly PropertyInfo<string> NombreProperty = RegisterProperty<string>(c => c.Nombre);
        /// <Summary>
        /// Gets or sets the Nombre value.
        /// </Summary>
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
        }

        public static readonly PropertyInfo<string> ApellidosProperty = RegisterProperty<string>(c => c.Apellidos);
        /// <Summary>
        /// Obtiene o setea el valor del apellido
        /// </Summary>
        public string Apellidos
        {
            get { return GetProperty(ApellidosProperty); }
        }

        public static readonly PropertyInfo<string> IdentificacionProperty = RegisterProperty<string>(c => c.Identificacion);
        /// <Summary>
        /// Gets or sets the Identificacion value.
        /// </Summary>
        public string Identificacion
        {
            get { return GetProperty(IdentificacionProperty); }
        }

        public static readonly PropertyInfo<string> EmailProperty = RegisterProperty<string>(c => c.Email);
        /// <Summary>
        /// Gets or sets the Email value.
        /// </Summary>
        public string Email
        {
            get { return GetProperty(EmailProperty); }
        }

        public static readonly PropertyInfo<string> DireccionProperty = RegisterProperty<string>(c => c.Direccion);
        /// <Summary>
        /// Gets or sets the Direccion value.
        /// </Summary>
        public string Direccion
        {
            get { return GetProperty(DireccionProperty); }
        }

        public static readonly PropertyInfo<string> CelularProperty = RegisterProperty<string>(c => c.Celular);
        /// <Summary>
        /// Obitiene o setea el valor del campo celular
        /// </Summary>
        public string Celular
        {
            get { return GetProperty(CelularProperty); }
        }

        private static PropertyInfo<string> TelefonoProperty = RegisterProperty<string>(o => o.Telefono, "Name");
        public string Telefono
        {
            get { return GetProperty(TelefonoProperty); }
        }

        private static PropertyInfo<string> NombreCompletoProperty = RegisterProperty<string>(o => o.NombreCompleto, "Name");
        public string NombreCompleto
        {
            get { return GetProperty(NombreCompletoProperty); }
        }

        #endregion

        #region Factory Methods

        internal static DatoEstadisticaInfo GetDatoEstadisticaInfo(object childData)
        {
            return DataPortal.FetchChild<DatoEstadisticaInfo>(childData);
        }

        private DatoEstadisticaInfo()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(Reader datos)
        {
            LoadProperty(ValorProperty, datos.Datos.GetString(1));
            LoadProperty(CantidadProperty,Convert.ToInt32(datos.Datos.GetString(2)));
        }

        #endregion
    }
}
